home *** CD-ROM | disk | FTP | other *** search
/ IRIS Performer 2.2 Friends Demo / SGI IRIS Performer 2.2 Friends Demo.iso / friends / openworlds / tix / SWidget.tcl < prev    next >
Text File  |  1997-11-22  |  8KB  |  376 lines

  1. # tixScrolledWidget
  2. #
  3. # --> virtual base class. Do not instantiate <--
  4. #    This is the core class for all scrolled widgets.
  5. #
  6. #
  7. # Options:
  8. #    -scrollbar: none, x, y, auto, both
  9. #
  10. #
  11. tixWidgetClass tixScrolledWidget {
  12.     -classname TixScrolledWidget
  13.     -superclass tixPrimitive
  14.     -method {
  15.     }
  16.     -flag {
  17.     -scrollbar
  18.     }
  19.     -configspec {
  20.     {-scrollbar scrollbar Scrollbar both}
  21.     }
  22. }
  23.  
  24. proc tixScrolledWidget::InitWidgetRec {w} {
  25.     upvar #0 $w data
  26.  
  27.     tixChainMethod $w InitWidgetRec
  28.  
  29.     set data(x,first)   0
  30.     set data(x,last)    0
  31.  
  32.     set data(y,first)   0
  33.     set data(y,last)    0
  34.  
  35.     set data(lastSpec) {}
  36.     set data(lastMW)   {}
  37.     set data(lastMH)   {}
  38.  
  39.     set data(repack)    0
  40.     set data(counter)  0
  41. }
  42.  
  43. proc tixScrolledWidget::SetBindings {w} {
  44.     upvar #0 $w data
  45.  
  46.     tixChainMethod $w SetBindings
  47.  
  48.     tixManageGeometry $data(pw:client) "tixScrolledWidget::ClientGeomProc $w"
  49.     bind $data(pw:client) <Configure> \
  50.     "tixScrolledWidget::ClientGeomProc $w {} $data(pw:client)"
  51.     bind $w <Configure> "tixScrolledWidget::MasterGeomProc $w"
  52.  
  53.     tixWidgetDoWhenIdle tixScrolledWidget::Repack $w
  54.     set data(repack) 1
  55. }
  56.  
  57. #----------------------------------------------------------------------
  58. #
  59. #         Scrollbar calculations
  60. #
  61. #----------------------------------------------------------------------
  62. proc tixScrolledWidget::ClientGeomProc {w type client} {
  63.     upvar #0 $w data
  64.  
  65.     if {$data(repack) == 0} {
  66.     set data(repack) 1
  67.     tixWidgetDoWhenIdle tixScrolledWidget::Repack $w
  68.     }
  69. }
  70.  
  71. proc tixScrolledWidget::MasterGeomProc {w} {
  72.     upvar #0 $w data
  73.  
  74.     if {$data(repack) == 0} {
  75.     set data(repack) 1
  76.     tixWidgetDoWhenIdle tixScrolledWidget::Repack $w
  77.     }
  78. }
  79.  
  80. proc tixScrolledWidget::Configure {w} {
  81.     if {![winfo exists $w]} {
  82.     return
  83.     }
  84.  
  85.     upvar #0 $w data
  86.  
  87.     if {$data(repack) == 0} {
  88.     set data(repack) 1
  89.     tixWidgetDoWhenIdle tixScrolledWidget::Repack $w
  90.     }
  91. }
  92.  
  93. proc tixScrolledWidget::ScrollCmd {w scrollbar axis first last} {
  94.     upvar #0 $w data
  95.  
  96.     $scrollbar set $first $last
  97. }
  98.  
  99. # Show or hide the scrollbars as required.
  100. #
  101. # spec: 00 = need none
  102. # spec: 01 = need y
  103. # spec: 10 = need x
  104. # spec: 11 = need xy
  105. #
  106. proc tixScrolledWidget::Repack {w} {
  107.     upvar #0 $w data
  108.  
  109.     if {![winfo exists $w]} {
  110.     # This was generated by the <Destroy> event
  111.     #
  112.     return
  113.     }
  114.  
  115.     set client $data(pw:client)
  116.  
  117.     # Calculate the size of the master
  118.     #
  119.     set mreqw [winfo reqwidth  $w]
  120.     set mreqh [winfo reqheight $w]
  121.     set creqw [winfo reqwidth  $client]
  122.     set creqh [winfo reqheight $client]
  123.  
  124.     set sbwidth [winfo reqwidth $w.vsb]
  125.  
  126.     if {$data(-width) != 0} {
  127.     set creqw $data(-width)
  128.     }
  129.     if {$data(-height) != 0} {
  130.     set creqh $data(-height)
  131.     }
  132.  
  133.     if {$mreqw != $creqw || $mreqh != $creqh } {
  134.     if {![info exists data(counter)]} {
  135.         set data(counter) 0
  136.     }
  137.     if {$data(counter) < 50} {
  138.         incr data(counter)
  139.         tixGeometryRequest $w $creqw $creqh
  140.         tixWidgetDoWhenIdle tixScrolledWidget::Repack $w
  141.         set data(repack) 1
  142.         return
  143.     }
  144.     }
  145.  
  146.     set data(counter) 0
  147.     set mw [winfo width  $w]
  148.     set mh [winfo height $w]
  149.  
  150.     set cw [expr $mw - $sbwidth]
  151.     set ch [expr $mh - $sbwidth]
  152.  
  153.     set scbx [expr $mw - $sbwidth]
  154.     set scby [expr $mh - $sbwidth]
  155.  
  156.     # Check the validity of the sizes: if window was not mapped then
  157.     # sizes will be below 1x1
  158.     if {$cw < 1} {
  159.     set cw 1
  160.     }
  161.     if {$ch < 1} {
  162.     set ch 1
  163.     }
  164.     if {$scbx < 1} {
  165.     set scbx 1
  166.     }
  167.     if {$scby < 1} {
  168.     set scby 1
  169.     }
  170.  
  171.     case $data(-scrollbar) in {
  172.     none {
  173.         set spec 00
  174.     }
  175.     x {
  176.         set spec 10
  177.     }
  178.     y {
  179.         set spec 01
  180.     }
  181.     both {
  182.         set spec 11
  183.     }
  184.     auto {
  185.         # Find out how we are going to pack the scrollbars
  186.         #
  187.         set spec [tixScrolledWidget::CheckScrollbars $w $sbwidth]
  188.     }
  189.     }
  190.  
  191.     if  {$data(lastSpec)==$spec && $data(lastMW)==$mw && $data(lastMH)==$mh} {
  192.     set data(repack) 0
  193.     return
  194.     }
  195.  
  196.     case $spec in {
  197.     "00" {
  198.         tixMoveResizeWindow $client 0 0 $mw $mh
  199.  
  200.         tixMapWindow $client
  201.             tixUnmapWindow $data(w:hsb)
  202. #        tixUnmapWindow $data(w:pann)
  203.         tixUnmapWindow $data(w:vsb)
  204.     }
  205.     "01" {
  206.         tixMoveResizeWindow $client 0 0 $cw $mh
  207.         tixMoveResizeWindow $data(w:vsb) $scbx 0 $sbwidth $mh
  208.  
  209.         tixMapWindow $client
  210.         tixUnmapWindow $data(w:hsb)
  211.         tixMapWindow $data(w:vsb)
  212. #        tixUnmapWindow $data(w:pann)
  213.     }
  214.     "10" {
  215.         tixMoveResizeWindow $client 0 0 $mw $ch
  216.         tixMoveResizeWindow $data(w:hsb) 0 $scby $mw $sbwidth 
  217.  
  218.         tixMapWindow $client
  219.         tixMapWindow $data(w:hsb)
  220.         tixUnmapWindow $data(w:vsb)
  221. #        tixUnmapWindow $data(w:pann)
  222.     }
  223.     "11" {
  224.         tixMoveResizeWindow $client 0 0 $cw $ch
  225.         tixMoveResizeWindow $data(w:hsb) 0 $scby $cw $sbwidth
  226.         tixMoveResizeWindow $data(w:vsb) $scbx 0 $sbwidth $ch
  227. #        tixMoveResizeWindow $data(w:pann) \
  228. #        [expr $scbx+2] [expr $scby+2] \
  229. #        [expr $sbwidth-4] [expr $sbwidth-4]
  230.  
  231.         tixMapWindow $client
  232.         tixMapWindow $data(w:hsb)
  233.         tixMapWindow $data(w:vsb)
  234. #        tixMapWindow $data(w:pann)
  235.     }
  236.     }
  237.  
  238.     set data(lastSpec) $spec
  239.     set data(lastMW)   $mw
  240.     set data(lastMH)   $mh
  241.  
  242.     tixCallMethod $w PlaceWindow
  243.     set data(repack) 0
  244. }
  245.  
  246. proc tixScrolledWidget::PlaceWindow {w} {
  247.     # virtual base function
  248. }
  249.  
  250. #
  251. # Helper function
  252. #
  253. proc tixScrolledWidget::NeedScrollbar {w axis} {
  254.     upvar #0 $w data
  255.  
  256.     if {$data($axis,first) > 0.0} {
  257.     return 1
  258.     }
  259.  
  260.     if {$data($axis,last) < 1.0} {
  261.     return 1
  262.     }
  263.     
  264.     return 0
  265. }
  266.  
  267. # Return whether H and V needs scrollbars in a list of two booleans
  268. #
  269. #
  270. proc tixScrolledWidget::CheckScrollbars {w scbWidth} {
  271.     upvar #0 $w data
  272.  
  273.     set mW [winfo width  $w]
  274.     set mH [winfo height $w]
  275.  
  276.     set info [tixCallMethod $w GeometryInfo $mW $mH]
  277.  
  278.     if {$info != {}} {
  279.     set xSpec [lindex $info 0]
  280.     set ySpec [lindex $info 1]
  281.  
  282.     set data(x,first)   [lindex $xSpec 0]
  283.     set data(x,last)    [lindex $xSpec 1]
  284.  
  285.     set data(y,first)   [lindex $ySpec 0]
  286.     set data(y,last)    [lindex $ySpec 1]
  287.     }
  288.  
  289.     set needX [tixScrolledWidget::NeedScrollbar $w x]
  290.     set needY [tixScrolledWidget::NeedScrollbar $w y]
  291.  
  292.     if {[winfo ismapped $w]==0} {
  293.     return "$needX$needY"
  294.     }
  295.  
  296.     if {$needX && $needY} {
  297.     return 11
  298.     }
  299.  
  300.     if {$needX == 0 && $needY == 0} {
  301.     return 00
  302.     }
  303.  
  304.     if {$needX} {
  305.     set mH [expr $mH - $scbWidth]
  306.     }
  307.     if {$needY} {
  308.     set mW [expr $mW - $scbWidth]
  309.     }
  310.  
  311.     set info [tixCallMethod $w GeometryInfo $mW $mH]
  312.     if {$info != {}} {
  313.     set xSpec [lindex $info 0]
  314.     set ySpec [lindex $info 1]
  315.  
  316.     set data(x,first)   [lindex $xSpec 0]
  317.     set data(x,last)    [lindex $xSpec 1]
  318.  
  319.     set data(y,first)   [lindex $ySpec 0]
  320.     set data(y,last)    [lindex $ySpec 1]
  321.     }
  322.  
  323.     set needX [tixScrolledWidget::NeedScrollbar $w x]
  324.     set needY [tixScrolledWidget::NeedScrollbar $w y]
  325.  
  326.     return "$needX$needY"
  327. }
  328.  
  329. #----------------------------------------------------------------------
  330. # Following is a bunch of crap. Not needed in TK 4.0.
  331. #----------------------------------------------------------------------
  332.  
  333. #----------------------------------------------------------------------
  334. # Keyboard events -
  335. #
  336. #    Raw event handlers: redirect binding events to class methods
  337. #
  338. proc tixScrolledWidget::RawUpKey {w} {
  339.     tixCallMethod $w HandleLineUp
  340. }
  341.  
  342. proc tixScrolledWidget::RawDownKey {w} {
  343.     tixCallMethod $w HandleLineDown
  344. }
  345.  
  346. proc tixScrolledWidget::RawLeftKey {w} {
  347.     tixCallMethod $w HandleLeftKey
  348. }
  349.  
  350. proc tixScrolledWidget::RawRightKey {w} {
  351.     tixCallMethod $w HandleRightKey
  352. }
  353.  
  354. proc tixScrolledWidget::RawPriorKey {w} {
  355.     tixCallMethod $w HandlePageUp
  356. }
  357.  
  358. proc tixScrolledWidget::RawNextKey {w} {
  359.     tixCallMethod $w HandlePageDown
  360. }
  361.  
  362. # Virtual event handlers: subclasses can derive from these functions
  363. #
  364.  
  365. proc tixScrolledWidget::HandleLineUp {w} {}
  366.  
  367. proc tixScrolledWidget::HandleLineDown {w} {}
  368.  
  369. proc tixScrolledWidget::HandlePageUp {w} {}
  370.  
  371. proc tixScrolledWidget::HandlePageDown {w} {}
  372.  
  373. proc tixScrolledWidget::HandleLeftKey {w} {}
  374.  
  375. proc tixScrolledWidget::HandleRightKey {w} {}
  376.